import axios from 'axios'
import router from '@/router'

const request = axios.create({
  // 注意：这里全局统一加上了 '/api' 前缀
  // 也就是意味着所有的请求路径都会默认添加这个前缀，那写接口的时候就不用写了
  // baseURL: 'http://139.159.176.201:8088/',
  baseURL: 'http://localhost:8088/',
  timeout: 50000
})

axios.defaults.headers.post['Contenst-Type'] = 'application/json;'

axios.defaults.headers.common['token'] = localStorage.getItem('token') // 在header中添加token

//  request 拦截器
// 可以自请求发送前对请求做一些处理
// 比如同意添加token，对请求参数加密等
request.interceptors.request.use(
  (config) => {
    config.headers['Content-Type'] = 'application/json;charset=utf-8'

    const token = localStorage.getItem('token') // 获取cookie

    console.log('拦截获取的token', token)

    if (token) {
      // console.log(JSON.parse(token).token)
      config.headers['token'] = token
    }
    //config.headers['token'] = user.token// 设置请求头
    return config
  },
  (error) => {
    return Promise.reject(error)
  }
)

// function handleErrorResponse(error) {
//   const { response } = error
//   if (response && response.data && typeof response.data === 'object') {
//     const { code, message } = response.data
//     // 如果后端返回了自定义的错误码和错误信息，则创建一个自定义的Error对象
//     const customError = new Error(message)
//     // 附加错误码到自定义Error对象上
//     customError.code = code
//     // 附加响应数据到自定义Error对象上（如果需要的话）
//     customError.response = response
//     // 抛出这个自定义错误
//     throw customError
//   }
//   // 如果不是后端自定义错误，则直接抛出Axios的Error对象
//   throw error
// }

// axios.interceptors.response.use(
//   (response) => {
//     // 对响应数据做正常处理，比如解析JSON等
//     console.log('响应了')

//     return response
//   },
//   (error) => {
//     console.log('又错了')

//     // 捕获响应错误，并抛出后端返回的自定义错误信息
//     return handleErrorResponse(error)
//   }
// )

// response 拦截器
// 可以在接口响应后统一处理结果
request.interceptors.response.use(
  (response) => {
    let res = response.data
    // 兼容服务器返回的字符串数据
    try {
      if (typeof res === 'string') {
        res = JSON.parse(res)
      }
    } catch (e) {
      // 处理解析错误，例如记录日志或返回特定的错误响应
      console.error('解析响应数据时出错:', e)
      return Promise.reject('出错了', e)
    }

    if (res.code == '401') {
      router.push('/userlogin')
    }
    return res
  },
  (error) => {
    console.log('error: ' + error.response)
    if (error.response && error.response.status) {
      // 请求已发出，服务器响应的状态码不在 2xx 范围内
      const { data } = error.response
      console.log('拦截', data)

      // 假设后端返回的错误格式是 {code: 自定义错误码, data: null, msg: "错误信息"}
      if (data && typeof data === 'object' && data.code && data.msg) {
        // 创建一个新的Error对象，包含后端的错误信息
        const customError = new Error(data.msg)
        // 可以给Error对象添加额外的属性来保存后端返回的错误码等信息
        customError.code = data.code
        customError.response = error.response // 可以附加整个响应对象

        // 返回一个rejected的 Promise，并附带自定义错误信息
        return Promise.reject(customError)
      }
    }

    return Promise.reject(error)
  }
)

export default request
